/*
 * @Author: EltonLi lijiaming@uavi-tech.com
 * @Date: 2023-10-11 14:28:54
 * @LastEditors: LVGRAPE
 * @LastEditTime: 2025-04-29 11:53:10
 * @FilePath: \zino-fc-v4\applications\ZINO_FC_V4.0\fc_rgb\fc_error.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#ifndef __FC_ERROR_H__
#define __FC_ERROR_H__

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdbool.h>
#include "stdint.h"
    typedef enum fc_errors
    {
        FC_ACC_GYRO_HARDFAULT = 0, // 陀螺仪与加速度计错误
        FC_BARO_HARDFAULT,         // 气压计错误
        FC_RC_HARDFAULT,           // 无线模块错误
        FC_OPTICALFLOW_HARDFAULT,  // 光流模块错误
        FC_COMPASS_HARDFAULT,      // 罗盘模块错误
        FC_IMU_CALIBRATING,        // 水平校准带中
        FC_RC_PAIRING,             // 无线对频中
        FC_RC_LOST,                // 无线无信号
        FC_COMPASS_CALIBRATING,    // 罗盘校准中
        FC_STANDBY,                // 一切正常，待机...(新手室内)
        FC_OK_TO_ARM,              // 解锁中
        FC_EMERGENCY_STOP,         // 急停
        FC_ARMED,                  // 解锁了
        FC_ARMING_ALERK,           // 解锁警报
        FC_MODE_STANDARD_INDOOR,   // 标准室内
        FC_MODE_STANDARD_OUTDOOR,  // 标准室外
        FC_LOW_POWER,              // 低电量
        FC_LASER_HARDFAULT,
        FC_PRO_STANDBY, // 编程一切正常，待机...(新手室内)
        FC_FACTORY_TEST,//出厂测试
        FC_MANUAL_MODE,//手动模式
        FC_FLIPING_MODE,//手动模式
        FC_LANDING,
        FC_LANDED,
        FC_HEADLESS_MODE,
        FC_PROGRAM_MODE,
        FC_TAKINGOFF,
        FC_AUTO_TAKINGOFF,
        FC_AIRBORN,
        FC_PRORAM_READY,
        FC_ERROR_COUNT,
    } fc_error_e;

    extern uint32_t fc_error_flag;

    typedef struct fc_error_inf
    {
        uint8_t blinkType;
        uint8_t colorCount;
        const uint8_t *color;
    } fc_error_s;

    typedef enum fc_error_blink
    {
        FC_ERROR_BLINK_NO = 0,
        FC_ERROR_BLINK_SLOW,
        FC_ERROR_BLINK_FAST,
        FC_ERROR_BLINK_BREATH,
    } fc_error_blink_e;

#define FC_ERROR_BLINK_SLOW_TIME 450
#define FC_ERROR_BLINK_FAST_TIME 80
#define FC_ERROR_BLINK_FAST_COUNT 3
#define FC_ERROR_CYCLE_TIME 1000

// 标记飞控错误状态
#define FC_ERROR_SET(error) (fc_error_flag |= ((uint32_t)(1 << error)))
// 清除飞控错误状态
#define FC_ERROR_RESET(error) (fc_error_flag &= ~((uint32_t)(1 << error)))
// 查询飞控错误状态
#define FC_ERROR_CHECK(error) (fc_error_flag & ((uint32_t)(1 << error)))
// 飞控是否一切正常，一切正常时RGB是呼吸灯待机状态
#define isFC_NO_ERROR() (fc_error_flag == 0)

#define get_FC_ERROR() (fc_error_flag)

    // 用RGB以特定的规律显示飞控的错误状态
    void fc_error_handle(void);
    void fc_sensor_test_rgb_handle(void);
    void rgb_set_color_sum(uint8_t sum, uint8_t r, uint8_t g, uint8_t b);
    // 串口打印飞控错误信息
    void fc_error_info_mesg(void);

#ifdef __cplusplus
}
#endif

#endif /* ZINO_IMU_IMU_H_ */
